BSD socket interface
socket interface の一例。一番有名なソケットだろう。 事前の理解の整理wint.icon
基本的には5つ組
↑ TCP 5-tuple に しか 当てはまらない
<family, local-addr, local-port, remote-addr, remote-port>
AF_INET ないし AF_INET6 での話
まず family を指定してソケットを作って、サーバーなら local addr, local port を bind して listen する。 accept したら、 remote addr, remote-port が確定して、あとは別スレッドで処理する。
だから、 bind するときの 192.168.0.1:9999 などのアドレスは、ローカルしか意味をなさないので、選べるのは3種いずれか:
unspecified (0.0.0.0)
loopback (127.0.0.0/16)
NIC (e.g. private range)
プロトコル指定
socket/3 については、通常は最初の 2引数で十分。
たとえば、 domain=AF_INET と type=SOCK_STREAM の時点で protocol が TCP だと確定するので、通常は未指定の protocol=0 にしてデフォルト値で良い。 アドレス指定
サーバー
受け付けアドレス
bind → listen
対向アドレス(クライアントのアドレス)
クライアント
相手アドレス
connect
自分は自動?wint.icon
ref.
プロトコルファミリ
AF_INET6, AF_UNIX = AF_LOCAL
通常はデフォルトプロトコルで十分
TCP と UDP は、ローカル IP アドレス、ローカルポート番号、外部 IP アドレス、 および外部ポート番号の 4 つを使用してアドレス指定を行います。
TCP では、これらの 4 つの要素は一意でなければなりません。
UDP にはこのような要求はありません。
EADDRINUSE
アドレスを未指定のままにすることにより、サーバーは、要求の到達先のネットワーク・インターフェースにかかわらず、そのポート用に作成された UDP パケットおよび TCP 接続要求 をすべて受け入れることができます。
EADDRINUSE